home *** CD-ROM | disk | FTP | other *** search
/ Workbench Add-On / Workbench Add-On - Volume 1.iso / Dev / Oberon / source / Library / Conversions.mod < prev    next >
Text File  |  1995-06-29  |  3KB  |  100 lines

  1. (*************************************************************************
  2.  
  3.      $RCSfile: Conversions.mod $
  4.   Description: Conversion of basic types to and from strings.
  5.  
  6.    Created by: fjc (Frank Copeland)
  7.     $Revision: 1.4 $
  8.       $Author: fjc $
  9.         $Date: 1995/06/04 23:22:41 $
  10.  
  11.   Copyright © 1994-1995, Frank Copeland.
  12.   This file is part of the Oberon-A Library.
  13.   See Oberon-A.doc for conditions of use and distribution.
  14.  
  15. *************************************************************************)
  16.  
  17. MODULE Conversions;
  18.  
  19. CONST DIGITS = "0123456789ABCDEF";
  20.  
  21. VAR digits : ARRAY 17 OF CHAR;
  22.  
  23.  
  24. PROCEDURE IntToStr *
  25.   ( int : LONGINT;
  26.     base, field : INTEGER;
  27.     padCh : CHAR;
  28.     VAR str : ARRAY OF CHAR )
  29.   : BOOLEAN;
  30.  
  31.   VAR i, j, k : INTEGER; temp : ARRAY 34 OF CHAR; neg : BOOLEAN;
  32.  
  33. BEGIN (* IntToStr *)
  34.   IF (base < 2) OR (base > 16) OR ~(base IN {2,8,10,16}) THEN
  35.     RETURN FALSE
  36.   END;
  37.   IF field > (LEN (str) - 1) THEN RETURN FALSE END;
  38.   IF int < 0 THEN neg := TRUE; IF int # MIN (LONGINT) THEN int := -int END
  39.   ELSE neg := FALSE
  40.   END;
  41.   IF int = MIN (LONGINT) THEN
  42.     IF base = 2 THEN temp := "1111111111111111111111111111111"; i := 31
  43.     ELSIF base = 8 THEN temp := "77777777771"; i := 11
  44.     ELSIF base = 10 THEN temp := "8463847412"; i := 10
  45.     ELSIF base = 16 THEN temp := "FFFFFFF7"; i := 8
  46.     END
  47.   ELSE
  48.     i := 0;
  49.     REPEAT
  50.       temp [i] := digits [SHORT (int MOD base)]; INC (i);
  51.       int := int DIV base
  52.     UNTIL int = 0;
  53.   END;
  54.   IF neg & (padCh # "0") THEN neg := FALSE; temp [i] := "-"; INC (i) END;
  55.   IF (neg & (i > (LEN (str) - 2))) OR (i > (LEN (str) - 1)) THEN
  56.     RETURN FALSE
  57.   END;
  58.   j := i; k := 0;
  59.   IF neg THEN str [k] := "-"; DEC (field); INC (k) END;
  60.   WHILE j < field DO str [k] := padCh; INC (j); INC (k) END;
  61.   WHILE i > 0 DO DEC (i); str [k] := temp [i]; INC (k) END;
  62.   str [k] := 0X;
  63.   RETURN TRUE
  64. END IntToStr;
  65.  
  66.  
  67. PROCEDURE StrToInt *
  68.   ( str : ARRAY OF CHAR; base : INTEGER; VAR int : LONGINT )
  69.   : BOOLEAN;
  70.  
  71.   VAR i, d, temp, limit : LONGINT; ch : CHAR; neg : BOOLEAN;
  72.  
  73. <*$CopyArrays-*>
  74. BEGIN (* StrToInt *)
  75.   IF (base < 2) OR (base > 16) THEN RETURN FALSE END;
  76.   limit := MAX (LONGINT) DIV base; i := 0; ch := str [i];
  77.   WHILE (ch # 0X) & (ch <= " ") DO INC (i); ch := str [i] END;
  78.   IF ch = "-" THEN neg := TRUE; INC (i); ch := str [i]
  79.   ELSE neg := FALSE
  80.   END;
  81.   temp := 0;
  82.   WHILE ch > " " DO
  83.     IF (ch >= "0") & (ch <= "9") THEN d := ORD (ch) - ORD ("0")
  84.     ELSIF (ch >= "A") & (ch <= "F") THEN d := ORD (ch) - (ORD ("A") - 10)
  85.     ELSIF (ch >= "a") & (ch <= "f") THEN d := ORD (ch) - (ORD ("a") - 10)
  86.     ELSE RETURN FALSE
  87.     END;
  88.     IF d >= base THEN RETURN FALSE END;
  89.     IF (limit - d) < temp THEN RETURN FALSE END;
  90.     temp := temp * base + d;
  91.     INC (i); ch := str [i]
  92.   END;
  93.   IF neg THEN int := -temp ELSE int := temp END;
  94.   RETURN TRUE
  95. END StrToInt;
  96.  
  97. BEGIN
  98.   digits := DIGITS
  99. END Conversions.
  100.